package com.linkit.controller;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;

import org.apache.http.NameValuePair;
import org.apache.http.message.BasicNameValuePair;
import org.json.JSONArray;

import android.util.Log;

import com.linkit.config.PageLinks;
import com.linkit.config.Setting;
import com.linkit.exception.ErrorCodes;
import com.linkit.exception.FTExceptions;
import com.linkit.main.MainActivity;
import com.linkit.main.article.ArticlesLayout;
import com.linkit.model.Article;
import com.linkit.model.HttpParams;
import com.linkit.model.ServiceTaskResult;
import com.linkit.utils.Constants;
import com.linkit.utils.ServiceUtils;
import com.linkit.utils.Utils;

/**
 * Xử lý chức năng tìm kiếm thông tin hãng trong tuyến
 * 
 * @author PDA
 * 
 */
public class ArticlesHandler extends Thread {
	// Tham số đầu vào
	private MainActivity main;
	private HttpParams configParameters;
	private HashMap<String, Object> referenceParams;
	private ArticlesLayout layout;
	private int refreshType;

	public ArticlesHandler(ArticlesLayout layout) {
		main = MainActivity.getInstance();
		this.layout = layout;
	}

	/**
	 * Yêu cầu lấy dữ liệu chi tiết của 1 xe
	 * 
	 * @param cRoute
	 */
	public void doRequest(int refreshType, String siteId, String cats,
			String type, Long date) {
		this.refreshType = refreshType;
		// kiểm tra có kết nối mạng hay không
		if (!main.isEnableNetworkAlert()) {
			return;
		}

		// hiện thị waiting để lấy dữ liệu từ server
		main.dialogManager.showWaiting(null);

		getArticle(siteId, cats, type, date);
	}

	/**
	 * Lấy thông tin các tuyến xe khách theo tỉnh - tỉnh
	 */
	public void getArticle(String siteId, String cats, String type, Long date) {

		configParameters = new HttpParams();

		List<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
		if (siteId != null) {
			nameValuePairs.add(new BasicNameValuePair(ConfigsHandler.SITE_ID, siteId));
		}

		if (cats != null) {
			nameValuePairs.add(new BasicNameValuePair(ConfigsHandler.CATS_ID, cats));
		}

		if (type != null && !Setting.SETTING_ALL_ID.equals(type)) {
			nameValuePairs.add(new BasicNameValuePair(ConfigsHandler.TYPE, String
					.valueOf(type)));
		}

		if (date != null) {
			nameValuePairs.add(new BasicNameValuePair(ConfigsHandler.LAST_DATE, String
					.valueOf(date)));
		}

		configParameters.setUrl(Constants.WEBSERVICE_URL);
		if (!nameValuePairs.isEmpty()) {
			configParameters.setParameters(nameValuePairs);
		}

		configParameters.setMethodName(PageLinks.ACTICLES_LIST.getName());

		referenceParams = new HashMap<String, Object>();

		// lấy dữ liệu từ server
		start();
	}

	/**
	 * Lấy dữ liệu từ server
	 */
	@Override
	public void run() {
		// Lưu trữ dữ liệu tải về từ Web
		ServiceTaskResult<String> result = new ServiceTaskResult<String>();
		String data = "";
		for (int i = 0; i < Constants.RETRY_CONNECTING_NUMBER; i++) {
			try {
				data = ServiceUtils.getServiceByGet(configParameters);
				result.setResult(data);
				break;
			} catch (Exception e) {
				result.setException(e);
				if (e instanceof FTExceptions) {
					continue;
				} else {
					break;
				}
			}
		}
		updateResult(result, referenceParams);
	}

	@SuppressWarnings("rawtypes")
	private synchronized void updateResult(ServiceTaskResult result,
			HashMap<String, Object> referentNumber) {
		if (result.hasException()) {

			doExceptions((FTExceptions) result.getException());
		} else {

			try {

				String resultStr = (String) result.getResult();
				ArrayList<Article> cInfo = getNewsList(resultStr);
				if (cInfo != null) {
					doResponse(cInfo);
				} else {
					// Xử lý ngoại lệ khi không có dữ liệu từ server
					doExceptions(new FTExceptions(ErrorCodes.NO_RESULT_ERROR));
				}

			} catch (Exception e) {
				Log.e(Constants.TAG,
						"PARSED_JSON_EXCEPTION: Lỗi khi lấy danh sách các tin mới nhất",
						e);
				// có lỗi khi parse dữ liệu trả về
				doExceptions(new FTExceptions(ErrorCodes.PARSED_JSON_EXCEPTION));
			}
		}
	}

	/**
	 * Lấy tin tức mới nhất
	 * 
	 * @param data
	 * @return
	 * @throws Exception
	 */
	private ArrayList<Article> getNewsList(String data) throws Exception {

		JSONArray jsonList = new JSONArray(data);

		if (jsonList.length() == 0)
			return null;

		ArrayList<Article> article = Utils.getNewsList(jsonList);

		return article;
	}

	/**
	 * Thực hiện truyền và hiện thị dữ liệu cho thông tin chi tiết của hãng
	 * 
	 * @param object
	 */
	public void doResponse(final ArrayList<Article> list) {

		main.runOnUiThread(new Runnable() {

			@Override
			public void run() {
				if (layout == null) {
					layout = new ArticlesLayout();
				}
				if (refreshType == ArticlesLayout.REFRESH) {
					layout.refresh(list);
				} else if (refreshType == ArticlesLayout.PUSH_TO_LOAD) {
					layout.loadItem(list);
				}else{
					layout.showPage(list);
				}

			}
		});

	}

	/**
	 * Xử lý các lỗi xảy ra khi lấy dữ liệu từ server
	 * 
	 * @param e
	 */
	public void doExceptions(FTExceptions e) {
		if (layout == null) {
			layout = new ArticlesLayout();
		}
		layout.handleExceptions(e);
	}
}
